package ajaxjs.config;

import java.util.HashMap;
import java.util.Map;

import javax.script.ScriptException;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.annotation.WebListener;

import ajaxjs.Constant;
import ajaxjs.js.JsEngine;
import ajaxjs.js.JsRuntime;
@WebListener
public class Application implements javax.servlet.ServletContextListener  {
	/**
	 * 有两种模式：本地模式和远程模式（自动判断）
	 * Linux 的为远程模式
	 */
	public static boolean isDebug = os_dectect();

	/**
	 * Bigfoot Rhino 类库的保存目录
	 */
	public static String Rhino_Path;
	
	/**
	 * 是否已经启动底层的 Rhino 完毕
	 */
	public static boolean isConfig_Ready = false;	
	
	/**
	 * 主 JS runtime，其他 js 包都导进这里来
	 */
	public final static JsRuntime jsRuntime = new JsEngine();
	
	/**
	 * 原始配置信息（包含所有的）
	 */
	public static Map<String, String> config;
	
	private static ServletContext servletContext;
	@Override
	public void contextInitialized(ServletContextEvent arg0) {
		servletContext = arg0.getServletContext();
		Rhino_Path = servletContext.getRealPath(Constant.ServerSide_JS_folder);

		System.out.println("=================================");
		System.out.println("欢迎使用 BigFoot 框架！初始化中……");
		System.out.println("当前版本：v" + Constant.FramewokrVersion);
		System.out.println("=================================");
		System.out.println(String.format(
			"当前环境：%s，运行于虚拟目录：%s", isDebug ? "调试环境" : "正式环境", servletContext.getContextPath()
		));
		System.out.println(Constant.ConsoleDiver);

		initJsRuntime();
		
		isConfig_Ready = true;
	}

	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
		System.out.println("Server Destroyed");		
	}

	private static boolean os_dectect() {
		String OS = System.getProperty("os.name").toLowerCase();
		return !(OS.indexOf("nix") >= 0 || OS.indexOf("nux") >= 0 || OS.indexOf("aix") > 0);
	}
	
	/**
	 * 初始化系统的 JS 运行时
	 */
	@SuppressWarnings("unchecked")
	private static void initJsRuntime(){
		String configPath = servletContext.getRealPath("/META-INF"),
			   Rhino_Path = servletContext.getRealPath(Constant.ServerSide_JS_folder);
		
		jsRuntime.load(new String[]{
			Rhino_Path + Constant.file_pathSeparator + "core.js",
			Rhino_Path + Constant.file_pathSeparator + "jsonpath.js",
			configPath + Constant.file_pathSeparator + "site_config.js",
			configPath + Constant.file_pathSeparator + "site_stru.js"
		});
		
//		sc.watch(configPath, new String[]{
//			servletContext.getRealPath("/META-INF/site_config.js")
//		});
		
		try {
			// 传递 isDebug
			jsRuntime.eval("bf.isDeubg = " + (isDebug ? "true" : "false"));
			// 保存全局信息，扁平化每一条配置
			config = (HashMap<String, String>)jsRuntime.eval("bf.initConfig();");
			
			ajaxjs.Util.log("加载 JSON 配置信息如下：", Application.class);
			System.out.println(ajaxjs.js.CodeFormatter.format(config.toString()));
			System.out.println(Constant.ConsoleDiver);
			
			// 保存 config 对象，供前端页面调用
			servletContext.setAttribute("config", config);
		} catch (ScriptException e) {
			e.printStackTrace();
		}
	}
}
